﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Com.Binaria.Core;
using Com.Binaria.Core.Enumeracion;
using Com.Binaria.Core.Exceptions;
using Com.Binaria.SISCOB.DTO;
using Com.Binaria.SISCOB.Dom;
using Com.Binaria.SISCOB.Funcional.DTO;
using Com.Binaria.Core.Util;


namespace Com.Binaria.SISCOB.Mgr
{

    public class CartolaMgr : ICartolaMgr
    {
        #region ATRIBUTOS A EXPONER AL USUARIO
        public ICartolaDom iCartolaDom;
        public IItemCartolaDom iItemCartolaDom;
        public IConstante iConstante;
        #endregion

        #region Miembros de ICartolaMgr
        public CartolaFuncionalDTO GetById(ContextoDTO oContexto, System.Int32? Id)
        {
            CartolaFuncionalDTO oItem = null;
            //
            try
            {
                CartolaDTO tmp = iCartolaDom.BuscarCartolaPorId(oContexto, Id);
                if (tmp != null)
                {
                    oItem = new CartolaFuncionalDTO();
                    oItem.Id = tmp.Id;
                    oItem.CuentaCorriente = Convert.ToInt32(tmp.IdCuentaCorriente);
                    oItem.Folio = Convert.ToInt32(tmp.Folio);
                    oItem.FchEmision = tmp.FchEmision;
                    oItem.FchDesde = tmp.FchDesde;
                    oItem.FchHasta = tmp.FchHasta;
                    oItem.Usuario = tmp.Usuario;
                    //Relacion : ItemCartola
                    ItemCartolaDTO oRel1 = new ItemCartolaDTO();
                    oRel1.IdCartola = Id;

                    IList<ItemCartolaDTO> oRel1s = iItemCartolaDom.BuscarItemCartolaFiltro(oContexto, oRel1);
                    if (oRel1s != null && oRel1s.Count > 0) 
                    {
                        oItem.ItemCartola = new List<ItemCartolaFuncionalDTO>(oRel1s.Count);
                        for (int i = 0; i < oRel1s.Count; i++) 
                        {
                            ItemCartolaFuncionalDTO oDet = new ItemCartolaFuncionalDTO();
                            oDet.Id = oRel1s[i].Id;
                            oDet.Sucursal = Convert.ToInt32(oRel1s[i].IdSucursal);
                            oDet.NmrOperacion = oRel1s[i].NmrOperacion;
                            oDet.DscOperacion = oRel1s[i].DscOperacion;
                            oDet.Monto = Convert.ToInt64(oRel1s[i].Monto);
                            oDet.FchOperacion = oRel1s[i].FchOperacion;
                            oDet.EstaProcesado = Convert.ToBoolean(oRel1s[i].EstaProcesado);
                            oDet.Tipo = oRel1s[i].Tipo;
                            oDet.TipoText = iConstante.getDomains("domTipoItemCartola").Where(itm => itm.Clave.Equals(oRel1s[i].Tipo)).First().Valor;
                            //
                            oItem.ItemCartola.Add(oDet);
                        }
                    }
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }

        public IList<CartolaFuncionalDTO> GetAll(ContextoDTO oContexto)
        {
            IList<CartolaFuncionalDTO> oItem = null;
            //
            try
            {
                IList<CartolaDTO> tmp = iCartolaDom.BuscarCartolaTodos(oContexto);
                if (tmp != null)
                {
                    oItem = new List<CartolaFuncionalDTO>(tmp.Count);
                    for (int i = 0; i < tmp.Count; i++)
                    {
                        CartolaFuncionalDTO oFDto = new CartolaFuncionalDTO();
                        oFDto.Id = tmp[i].Id;
                        oFDto.CuentaCorriente = Convert.ToInt32(tmp[i].IdCuentaCorriente);
                        oFDto.Folio = Convert.ToInt32(tmp[i].Folio);
                        oFDto.FchEmision = tmp[i].FchEmision;
                        oFDto.FchDesde = tmp[i].FchDesde;
                        oFDto.FchHasta = tmp[i].FchHasta;
                        oFDto.Usuario = tmp[i].Usuario;
                        //
                        oItem.Add(oFDto);
                    }
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }

        public IList<CartolaFuncionalDTO> GetBy(ContextoDTO oContexto, CartolaFuncionalDTO item)
        {
            IList<CartolaFuncionalDTO> oItem = null;
            //
            try
            {
                IList<CartolaDTO> tmp = null;
                if (item == null)
                    tmp = iCartolaDom.BuscarCartolaTodos(oContexto);
                else
                {
                    CartolaDTO oDto = new CartolaDTO();
                    oDto.Id = item.Id;
                    if (item.CuentaCorriente > 0) oDto.IdCuentaCorriente = item.CuentaCorriente;
                    if (item.Folio > 0) oDto.Folio = item.Folio;
                    oDto.FchEmision = item.FchEmision;
                    oDto.FchDesde = item.FchDesde;
                    oDto.FchHasta = item.FchHasta;
                    if (!string.IsNullOrEmpty(item.Usuario)) oDto.Usuario = item.Usuario;
                    //
                    tmp = iCartolaDom.BuscarCartolaFiltro(oContexto, oDto);
                }

                if (tmp != null)
                {
                    oItem = new List<CartolaFuncionalDTO>(tmp.Count);
                    for (int i = 0; i < tmp.Count; i++)
                    {
                        CartolaFuncionalDTO oFDto = new CartolaFuncionalDTO();
                        oFDto.Id = tmp[i].Id;
                        oFDto.CuentaCorriente = Convert.ToInt32(tmp[i].IdCuentaCorriente);
                        oFDto.Folio = Convert.ToInt32(tmp[i].Folio);
                        oFDto.FchEmision = tmp[i].FchEmision;
                        oFDto.FchDesde = tmp[i].FchDesde;
                        oFDto.FchHasta = tmp[i].FchHasta;
                        oFDto.Usuario = tmp[i].Usuario;
                        //
                        oItem.Add(oFDto);
                    }
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }

        [Binaria.Core.Attribute.Trasanction(System.Transactions.TransactionScopeOption.Required)]
        public bool Save(ContextoDTO oContexto, CartolaFuncionalDTO item)
        {
            bool IsOK = false;
            bool IsExist = (item.Id.HasValue && item.Id > 0);
            List<int> oUpd = null;
            try
            {
                //Relacion : ItemCartola  - Comprobar Composicion C
                if (item.ItemCartola == null || item.ItemCartola.Count < 1)
                    throw new ManagerException("La relacion «ItemCartola» espera al menos 1 elemento", System.Diagnostics.TraceEventType.Warning);

                CartolaDTO oDto = new CartolaDTO();
                oDto.Id = item.Id;
                oDto.IdCuentaCorriente = item.CuentaCorriente;
                oDto.Folio = item.Folio;
                oDto.FchEmision = item.FchEmision;
                oDto.FchDesde = item.FchDesde;
                oDto.FchHasta = item.FchHasta;
                oDto.Usuario = item.Usuario;

                if (IsExist)
                    iCartolaDom.RegistrarCartola(oContexto, new List<CartolaDTO>() { oDto }, EnumRegistrarAccion.Modificar);
                else
                    iCartolaDom.RegistrarCartola(oContexto, new List<CartolaDTO>() { oDto }, EnumRegistrarAccion.Agregar);

                //Relacion MD18: ItemCartola
                oUpd = null;
                if (IsExist)
                {
                    ItemCartolaDTO oRel1 = new ItemCartolaDTO();
                    oRel1.IdCartola = oDto.Id;
                    List<ItemCartolaDTO> oRel1s = iItemCartolaDom.BuscarItemCartolaFiltro(oContexto, oRel1);
                    if (oRel1s != null && oRel1s.Count > 0)
                    {
                        //UPD - DEL
                        if (item.ItemCartola != null)
                        {
                            oUpd = item.ItemCartola.Join(oRel1s
                                    , ori => ori.Id
                                    , des => des.Id
                                    , (ori, des) => (int)des.Id).ToList();
        
                            oRel1s = oRel1s.Where(ori => !item.ItemCartola.Any(des => des.Id == ori.Id)).ToList();
                        }
                    }
                    iItemCartolaDom.RegistrarItemCartola(oContexto, oRel1s, EnumRegistrarAccion.Eliminar);
                }
                
                if (item.ItemCartola != null) 
                {
                    for (int i = 0; i < item.ItemCartola.Count; i++) 
                    {
                        ItemCartolaDTO oRel1 = new ItemCartolaDTO();
                        oRel1.IdCartola = oDto.Id;                        
                        oRel1.Id = item.ItemCartola[i].Id;
                        bool esta_ = (oUpd != null && oRel1.Id.HasValue && oUpd.Contains((int)oRel1.Id));
                        //
                        if (item.ItemCartola[i].Sucursal > 0) oRel1.IdSucursal = item.ItemCartola[i].Sucursal;
                        oRel1.NmrOperacion = item.ItemCartola[i].NmrOperacion;
                        oRel1.DscOperacion = item.ItemCartola[i].DscOperacion;
                        oRel1.Monto = item.ItemCartola[i].Monto;
                        oRel1.FchOperacion = item.ItemCartola[i].FchOperacion;
                        oRel1.EstaProcesado = item.ItemCartola[i].EstaProcesado;
                        oRel1.Tipo = item.ItemCartola[i].Tipo;
                        //
                        iItemCartolaDom.RegistrarItemCartola(oContexto, new List<ItemCartolaDTO>() { oRel1 }, esta_ ? EnumRegistrarAccion.Modificar : EnumRegistrarAccion.Agregar);
                    }
                }
                IsOK = true;
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return IsOK;
        }

        [Binaria.Core.Attribute.Trasanction(System.Transactions.TransactionScopeOption.Required)]
        public bool Delete(ContextoDTO oContexto, CartolaFuncionalDTO item)
        {
            bool IsOK = false;
            bool IsExist = (item.Id.HasValue && item.Id > 0);

            try
            {
                CartolaDTO oDto = new CartolaDTO();
                oDto.Id = item.Id;
                
                if (IsExist)
                {
                    //Relacion :  ItemCartola
                    ItemCartolaDTO oRel1 = new ItemCartolaDTO();
                    oRel1.Id = item.Id;
                    List<ItemCartolaDTO> oRel1s = iItemCartolaDom.BuscarItemCartolaFiltro(oContexto, oRel1);
                    if (oRel1s != null && oRel1s.Count > 0)
                    {
                        iItemCartolaDom.RegistrarItemCartola(oContexto, oRel1s, EnumRegistrarAccion.Eliminar);
                    }
                    iCartolaDom.RegistrarCartola(oContexto, new List<CartolaDTO>() { oDto }, EnumRegistrarAccion.Eliminar);
                }
                IsOK = true;
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return IsOK;
        }


        public IList<CartolaFuncionalDTO> GetAllPag(ContextoDTO oContexto, CartolaFuncionalDTO item)
        {
            IList<CartolaFuncionalDTO> oItem = null;
            //
            try
            {
                IList<CartolaDTO> tmp = null;
                if (item == null)
                    tmp = iCartolaDom.BuscarCartolaTodos(oContexto);
                else
                {
                    CartolaDTO oDto = new CartolaDTO();
                    oDto.Id = item.Id;
                    if (item.CuentaCorriente > 0) oDto.IdCuentaCorriente = item.CuentaCorriente;
                    if (item.Folio > 0) oDto.Folio = item.Folio;
                    oDto.FchEmision = item.FchEmision;
                    oDto.FchDesde = item.FchDesde;
                    oDto.FchHasta = item.FchHasta;
                    if (!string.IsNullOrEmpty(item.Usuario)) oDto.Usuario = item.Usuario;
                    if (item.Pagina > 0) oDto.Pagina = item.Pagina;
                    if (item.SizePagina > 0) oDto.SizePagina = item.SizePagina;
                    if (!string.IsNullOrEmpty(item.ColumnOrden)) oDto.ColumnOrden = item.ColumnOrden;
                    if (!string.IsNullOrEmpty(item.TipoOrden)) oDto.TipoOrden = item.TipoOrden;
                    //
                    tmp = iCartolaDom.BuscarCartolaFiltroPaginado(oContexto, oDto);
                }

                if (tmp != null)
                {
                    oItem = new List<CartolaFuncionalDTO>(tmp.Count);
                    for (int i = 0; i < tmp.Count; i++)
                    {
                        CartolaFuncionalDTO oFDto = new CartolaFuncionalDTO();
                        oFDto.Id = tmp[i].Id;
                        oFDto.CuentaCorriente = Convert.ToInt32(tmp[i].IdCuentaCorriente);
                        oFDto.Folio = Convert.ToInt32(tmp[i].Folio);
                        oFDto.FchEmision = tmp[i].FchEmision;
                        oFDto.FchDesde = tmp[i].FchDesde;
                        oFDto.FchHasta = tmp[i].FchHasta;
                        oFDto.Usuario = tmp[i].Usuario;
                        oFDto.TotalRegistros = Convert.ToInt64(tmp[i].TotalRegistros);
                        //
                        oItem.Add(oFDto);
                    }
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }


        #endregion
    }
}
